﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace TcpServ
{
    public partial class Form1 : Form
    {
        /*class Client
        {
            public int ID;
            public System.Net.EndPoint EndPoint;
            public override string ToString()
            {
                return EndPoint.AddressFamily.ToString();
            }
        }*/

        public Form1()
        {
            InitializeComponent();
        }

        private void btnStart_Click(object sender, EventArgs e)
        {
            srv.LocalIP = txbIP.Text.Trim();
            srv.LocalPort = Convert.ToInt32(txbPort.Text.Trim());
            if (srv.Start())
            {
                txbIP.Enabled = false;
                txbPort.Enabled = false;
                btnStart.Enabled = false;
                btnStop.Enabled = true;
                AddLog("Старт сервера " + srv.LocalPoint);
                RefillClientList();
            }
            else AddLog("Не удалось запустить сервер");
            btnUpdateLogServ_Click(null, null);
        }

        private void btnStop_Click(object sender, EventArgs e)
        {
            if (srv.Stop())
            {
                txbIP.Enabled = true;
                txbPort.Enabled = true;
                btnStart.Enabled = true;
                btnStop.Enabled = false;
                AddLog("Стоп сервера " + srv.LocalPoint);
                RefillClientList();
            }
            else AddLog("Не удалось остановить сервер");
            btnUpdateLogServ_Click(null, null);
        }

        void AddLog(string Mess)
        {
            txbLog.AppendText(string.Format("[{0}] {1}\r\n", DateTime.Now.ToString("dd.MM.yy HH:mm:ss,fff"), Mess));
        }

        private void btnUpdateLogServ_Click(object sender, EventArgs e)
        {
            string[] log = srv.GetLog();
            StringBuilder sb = new StringBuilder();
            foreach (string s in log) sb.AppendLine(s);
            txbLogServ.Text = sb.ToString();
            txbLogServ.Select(txbLogServ.Text.Length, 0);
            txbLogServ.ScrollToCaret();
        }

        private void srv_OnConnect(object Sender, ESpace.ETcpServer.ConnectEventArgs e)
        {
            AddLog("Подключился клиент " + srv.Clients[e.indClient].RemoteEndPoint.ToString());
            RefillClientList();
            btnUpdateLogServ_Click(null, null);
        }

        private void srv_OnDisconnect(object Sender, ESpace.ETcpServer.DisconnectEventArgs e)
        {
            AddLog("Отключился клиент " + e.endPoint.ToString());
            RefillClientList();
            btnUpdateLogServ_Click(null, null);
        }

        private void srv_OnRecive(object Sender, ESpace.ETcpServer.RecvEventArgs e)
        {
            AddLog(string.Format("Принят пакет от клинта {0} длиной {1}", srv.Clients[e.indClient].RemoteEndPoint.ToString(), e.buf.Length));
            RefillClientList();
            btnUpdateLogServ_Click(null, null);
        }

        void RefillClientList()
        {
            lbCl.Items.Clear();
            foreach (System.Net.Sockets.Socket s in srv.Clients)
                lbCl.Items.Add(s.RemoteEndPoint.ToString());
        }

        private void btnTest_Click(object sender, EventArgs e)
        {
            if (lbCl.SelectedIndex == -1) { MessageBox.Show("Не выбран клиент"); return; }
            System.Net.Sockets.Socket client = srv.Clients[lbCl.SelectedIndex];
            System.Net.EndPoint endPoint = srv.Clients[lbCl.SelectedIndex].RemoteEndPoint;

            int[] sendList = new int[] { 100, 20, 23001, 30 };

            foreach (int i in sendList)
            {
                ESpace.SendAns ans = srv.Send(new byte[i], lbCl.SelectedIndex);
                if (ans == ESpace.SendAns.Ok)
                {
                    AddLog(string.Format("Отправлено клиенту {0} {1} байт", endPoint, i));
                    continue;
                }
                else if (ans == ESpace.SendAns.Failure) AddLog(string.Format("Не удалось отправить клиенту {0} {1} байт", endPoint, i));
                else AddLog(string.Format("Не удалось отправить клиенту {0} {1} байт. Клиент уже отключился", endPoint, i));
                break;
            }
            btnUpdateLogServ_Click(null, null);
        }

        private void btnDisconnectClient_Click(object sender, EventArgs e)
        {
            if (lbCl.SelectedIndex == -1) { MessageBox.Show("Не выбран клиент"); return; }
            srv.DisconnectClient(lbCl.SelectedIndex);
        }

    }
}
